package JUC.多线程;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * @author CKC
 * @DateTime 2021/4/1 21:38
 * <p>
 * 多线程中，第3种获取线程的方式
 * <p>
 * 第一种继承Thread类  第二种实现 Runnable 接口
 */
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        
        FutureTask<Integer> futureTask = new FutureTask<>(new MyThread());
        new Thread(futureTask, "AA").start();
        new Thread(futureTask, "BB").start();//不会进入，但是会复用
        
        /**
         * FutureTask<Integer> futureTask = new FutureTask<>(new MyThread());
         * FutureTask<Integer> futureTask1 = new FutureTask<>(new MyThread());
         * new Thread(futureTask, "AA").start();
         * new Thread(futureTask1, "BB").start();
         */
        
/*        while (!futureTask.isDone()){
            System.out.println("********");
        }*/
        
        System.out.println(Thread.currentThread().getName() + "********result: " + futureTask.get());
        
        /**
         * futureTask.get()
         * 建议放到最后   futureTask.get()任务还没有完成会阻塞主线程(当前案例的分析测试)
         * 要求获取Callable线程的计算结果，如果没有计算完成就要去强求，会导致堵塞，直到计算完成。
         */
    }
}

class MyThread implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "******come in Callable ");
        try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
        return 1024;
    }
}

class MyThread1 implements Runnable {
    
    @Override
    public void run() {
    }
    
}
